package com.curry.android.util;

import android.util.Log;

import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * http://blog.csdn.net/lianqiangjava/article/details/30258461
 * <p/>
 * Created by wgf on 160408.
 *
 * @author lianqiangjava on 2014-06-12 16:23.
 */
public class JsonToMapHelper {
    /**
     * 获取JsonObject
     *
     * @param json
     * @return
     */
    public static JsonObject parseJson(String json) {
        JsonParser parser = new JsonParser();
        JsonObject jsonObj = parser.parse(json).getAsJsonObject();
        return jsonObj;
    }

    /**
     * 根据json字符串返回Map对象
     *
     * @param json
     * @return
     */
    public static Map<String, Object> toMap(String json) {
        return JsonToMapHelper.toMap(JsonToMapHelper.parseJson(json));
    }

    /**
     * 将JSONObjec对象转换成Map-List集合
     *
     * @param json
     * @return
     */
    public static Map<String, Object> toMap(JsonObject json) {
        Map<String, Object> map = new HashMap<>();
        if (json == null) {
            Log.e(JsonToMapHelper.class.getSimpleName(), "传入的JsonObject为空");
            return map;
        }
        Set<Map.Entry<String, JsonElement>> entrySet = json.entrySet();
        for (Iterator<Map.Entry<String, JsonElement>> iter = entrySet.iterator(); iter.hasNext(); ) {
            Map.Entry<String, JsonElement> entry = iter.next();
            String key = entry.getKey();
//            Object value = entry.getValue();
            JsonElement value = entry.getValue();
            if (value == null || value.isJsonNull()) {
                map.put(key, "null");
            } else if (value.isJsonArray()) {
                map.put(key, toList(value.getAsJsonArray()));
            } else if (value.isJsonObject()) {
                map.put(key, toMap(value.getAsJsonObject()));
            } else {
                //String check = String.valueOf(value);//不能直接使用String.valueOf()方法，因为这个JSON类已经重写了toString()方法
                String check = "";
                try {
                    check = value.getAsString();
                } catch (Exception e) {
                    e.printStackTrace();
                }
                map.put(key, check);
            }
        }
        return map;
    }

    /**
     * 将JSONArray对象转换成List集合
     *
     * @param json
     * @return
     */
    public static List<Object> toList(JsonArray json) {
        List<Object> list = new ArrayList<>();
        if (json == null) {
            Log.e(JsonToMapHelper.class.getSimpleName(), "传入的JsonArray为空");
            return list;
        }
        for (int i = 0; i < json.size(); i++) {
            JsonElement value = json.get(i);
            if (value.isJsonArray()) {
                list.add(toList(value.getAsJsonArray()));
            } else if (value.isJsonObject()) {
                list.add(toMap(value.getAsJsonObject()));
            } else {
                list.add(value);
            }
        }
        return list;
    }

}
